ISSDK  1.8
IoT Sensing Software Development Kit
fxls8974cf_freemaster_demo.c
Go to the documentation of this file.
1 /*
2  * Copyright 2022 NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 /**
9  * @file fxls8974cf_freemaster_demo.c
10  * @brief The fxls8974cf_freemaster_demo.c file implements FreeMASTER demo using the ISSDK
11  * FXLS8974CF sensor driver example demonstration with interrupt mode.
12  */
13 
14 //-----------------------------------------------------------------------
15 // SDK Includes
16 //-----------------------------------------------------------------------
17 #include "pin_mux.h"
18 #include "clock_config.h"
19 #include "board.h"
20 #include "fsl_debug_console.h"
21 #include "math.h"
22 #ifndef CPU_LPC55S16JBD100
23 #include "fsl_uart.h"
24 #else
25 #include "fsl_usart.h"
26 #endif
27 #include "fsl_common.h"
28 #include "freemaster.h"
29 #include "freemaster_serial_uart.h"
30 //-----------------------------------------------------------------------
31 // CMSIS Includes
32 //-----------------------------------------------------------------------
33 #include "Driver_I2C.h"
34 
35 //-----------------------------------------------------------------------
36 // ISSDK Includes
37 //-----------------------------------------------------------------------
38 #include "issdk_hal.h"
39 #include "gpio_driver.h"
40 #include "fxls8974_drv.h"
41 #include "systick_utils.h"
42 
43 //-----------------------------------------------------------------------
44 // Macros
45 //-----------------------------------------------------------------------
46 #define FXLS8974_NUM_REGISTERS (FXLS8974_SELF_TEST_CONFIG2 + 1)
47 #define FF_A_FFMT_THS (0x08) /* FreeFall Threshold Value. */
48 #define A_FFMT_COUNT (0x18) /* Freefall/motion debounce count value. */
49 #define PL_COUNT (0x15) /* Pulse debounce count value. */
50 #define ASLP_COUNTER (0x07) /* Auto Sleep after ~5s. */
51 #define ACCEL_2G_SENS (0.000976) /* Sensitivity factor for 2G FS */
52 #define ACCEL_4G_SENS (0.001953) /* Sensitivity factor for 4G FS */
53 #define ACCEL_8G_SENS (0.003906) /* Sensitivity factor for 8G FS */
54 #define ACCEL_16G_SENS (0.007813) /* Sensitivity factor for 16G FS */
55 #define N (100U) /* Number of samples used to measure offset/noise */
56 #define RAW_ACCEL_DATA_SIZE (6U) /* Accel Data Size */
57 #define MAX8BITSTORAGE (255U)
58 #define FXLS8974_DATA_SIZE 6
59 //-----------------------------------------------------------------------
60 // Constants
61 //-----------------------------------------------------------------------
62 /*! @brief Defines the register write list to configure FXLS8974 in Interrupt mode. */
64  /*! Set Full-scale range as 4G. */
66  /*! Clear SENS_CONFIG2 */
67  {FXLS8974_SENS_CONFIG2, 0x00, 0x00},
68  /*! Disable Self-Test. */
70  /*! Set Wake Mode ODR Rate as 12.5Hz. */
72  /*! Enable Interrupts for Data Ready Events. */
74  /*! Enable Temperature sensor. */
76  /*! Set Self-Test ODR to 100 Hz. */
77  {0x38,0x05,0x00},
78  {0x2F,0x38,0x00},
79  {0x30,0xD8,0x00},
80  {0x33,0xC0,0x00},
81  {0x34,0xFF,0x00},
82  {0x35,0x40,0x00},
84 
85 /*! @brief Register settings for Self-Test in X Axis (Positive polarity). */
87  /* Set Self Test Axis. */
92 
93 /*! @brief Register settings for Self-Test in X Axis (Negative polarity). */
95  /* Set Self Test Axis. */
100 
101 /*! @brief Register settings for Self-Test in Y Axis (Positive polarity). */
103  /* Set Self Test Axis. */
108 
109 /*! @brief Register settings for Self-Test in Y Axis (Negative polarity). */
111  /* Set Self Test Axis. */
116 
117 /*! @brief Register settings for Self-Test in Z Axis (Positive polarity). */
119  /* Set Self Test Axis. */
124 
125 /*! @brief Register settings for Self-Test in Z Axis (Negative polarity). */
127  /* Set Self Test Axis. */
132 
133 /*! @brief Address of Raw Accel Data in Normal Mode. */
136 
138  {.readFrom = FXLS8974_WHO_AM_I, .numBytes = 1}, __END_READ_DATA__};
139 
140 /*! @brief Prepare the register read for INT Status Register. */
142  {.readFrom = FXLS8974_INT_STATUS, .numBytes = 1}, __END_READ_DATA__};
143 
144 /*! @brief Prepare the register read for FullScale range Register. */
146  {.readFrom = FXLS8974_SENS_CONFIG1, .numBytes = 1}, __END_READ_DATA__};
147 
148 /*! @brief FXLS8974 register list to read all registers */
151 
152 //-----------------------------------------------------------------------
153 // Global Variables
154 //-----------------------------------------------------------------------
155 /*! @brief This structure defines the fxls8974 all registers metadata.*/
156 typedef struct
157 {
158  uint8_t offset;
159  uint8_t value;
160  uint8_t trigger;
161  uint8_t read_offset;
162  uint8_t read_value;
163  uint8_t read_trigger;
164  uint8_t readall_value[FXLS8974_NUM_REGISTERS];
165  uint8_t readall_size;
167  uint8_t toggle;
170  uint8_t fs_value;
171  uint8_t mods_value;
172  uint8_t odr_value;
173  uint8_t reg_addr[FXLS8974_NUM_REGISTERS];
174  uint8_t dataready_cntr;
175  float accel[3];
176  int16_t accelraw[3];
177  uint8_t sdcd;
178  int8_t temp;
179  int16_t selftest[3];
180  uint32_t timestamp;
182 //-----------------------------------------------------------------------
183 /*! @brief This structure defines the fxls8974 offset and noise calculation parameters. */
184 typedef struct
185 {
186  float offx;
187  float offy;
188  float offz;
189  float rmsx;
190  float rmsy;
191  float rmsz;
194 
195 /*! @brief This structure defines variables to compute self-test output change (STOC) and self-test offset (STOF). */
196 typedef struct
197 {
198  int16_t x_stoc;
199  int16_t y_stoc;
200  int16_t z_stoc;
201  int16_t x_stof;
202  int16_t y_stof;
203  int16_t z_stof;
206 
207 /*! @brief This structure defines the fxls8974 raw data buffer.*/
208 typedef struct
209 {
210  int16_t xdata; /*!< The x accel data */
211  int16_t ydata; /*!< The y accel data */
212  int16_t zdata; /*!< The z accel data */
213 } sensor_data;
214 
215 
216 typedef union rawdata
217 {
218  uint8_t byte_data[sizeof(sensor_data)];
220 }RAW_DATA;
221 
222 /*! @brief This structure defines the fxls8974 host operation type.*/
224 {
229 
231 
232 /*******************************************************************************
233  * Globals
234  ******************************************************************************/
235 
240 uint8_t prev_toggle = 1;
241 volatile bool bFxls8974IntFlag = false;
242 
243 static FMSTR_U8 recBuffer[1024*10];
244 FMSTR_REC_BUFF recBuffCfg;
245 FMSTR_REC_VAR recVar;
246 FMSTR_REC_CFG recCfg;
247 
249 static unsigned char pipe3_rxb[512];
250 static unsigned char pipe3_txb[0x1000];
251 
252 uint8_t axis=0;
253 /* variables to store self-test values (Positive(P) + / Negative(N) -) */
254 int16_t XSTP[2]={0,0},YSTP[2]={0,0},ZSTP[2]={0,0},XSTN[2]={0,0},YSTN[2]={0,0},ZSTN[2]={0,0};
255 
256 
257 /*******************************************************************************
258  * Local functions
259  ******************************************************************************/
260  /*! @brief Function to initialize target communication to FreeMASTER host.
261  * @details This function initializes FreeMASTER UART communication.
262  * @param[in] void.
263  * @return void.
264  */
265 static void init_freemaster_uart(void);
266 /*! @brief ISR for FXLS8974 interrupt source event.
267  * @details This function implements ISR for FXLS8974 INT source.
268  * @param[in] void *.
269  * @return void.
270  */
271 void fxls8974_isr_callback(void *pUserData);
272 /*! @brief Function to apply FXLS8974 register write operation.
273  * @details This function apply FXLS8974 register write based on write trigger from host.
274  * @param[in] fxls8974_i2c_sensorhandle_t fxls8974Driver, FXLS8974 sensor I2C handle.
275  * @param[in] uint8_t offset, the address of the register to start writing from.
276  * @param[in] uint8_t value, value to write on register offset.
277  * @return returns the status of the operation.
278  */
280 /*! @brief Function to apply FXLS8974 register read operation.
281  * @details This function apply FXLS8974 register read based on read trigger from host.
282  * @param[in] fxls8974_i2c_sensorhandle_t fxls8974Driver, FXLS8974 sensor I2C handle.
283  * @param[in] uint8_t offset, the address of the register to read from.
284  * @param[in/out] uint8_t *value, pointer to output buffer.
285  * @return returns the status of the operation.
286  */
287 int32_t apply_register_read(fxls8974_i2c_sensorhandle_t fxls8974Driver, uint8_t offset, uint8_t *value);
288 /*! @brief Function to apply FXLS8974 register read-all operation.
289  * @details This function apply FXLS8974 all-registers read based on read-all trigger from host.
290  * @param[in] fxls8974_i2c_sensorhandle_t fxls8974Driver, FXLS8974 sensor I2C handle.
291  * @return returns the status of the operation.
292  */
294 /*! @brief Function to update dropdown selection.
295  * @details This function updates the dropdown selection values in real-time based on read/write/read-all triggers.
296  * @param[in/out] fxls8974_allregs_t *registers, pointer to FXLS8974 all-registers metadata.
297  * @param[in] uint8_t caller, called from which operation type.
298  * @return returns the status of the operation.
299  */
300 int32_t update_dropdown_selection(fxls8974_allregs_t *registers, uint8_t caller);
301 /*! @brief Function to initialize offset noise measurement.
302  * @details This function initializes offset noise measurement metadata.
303  * @param[in/out] fxls8974_offset_noise_t *offnoiseptr, pointer to FXLS8974 offset noise metadata.
304  * @return void.
305  */
306 void offset_noise_init(fxls8974_offset_noise_t *offnoiseptr);
307 /*! @brief Function to measure accelerometer offset noise.
308  * @details This function measures accelerometer offset noise.
309  * @param[in] fxls8974_acceldata_t *rawData, pointer to FXLS8974 rawdata metadata.
310  * @param[in/out] fxls8974_offset_noise_t *offnoiseptr, pointer to FXLS8974 offset noise metadata.
311  * @param[in] float sens, FXLS8974 sensitivity based on FS configuration.
312  * @return void.
313  */
314 void accel_off_noise(fxls8974_acceldata_t* rawData, fxls8974_offset_noise_t *offnoiseptr, float sens);
315 /*! @brief Function to initialize FXLS8974 self test metadata.
316  * @details This function initializes FXLS8974 self test metadata.
317  * @param[in/out] fxls8974_selftest_t *selftest, pointer to FXLS8974 selftest metadata.
318  * @return void.
319  */
320 void selftest_init(fxls8974_selftest_t *selftest);
321 /*! @brief Function to perform FXLS8974 self test.
322  * @details This function performs FXLS8974 self test.
323  * @param[in] fxls8974_i2c_sensorhandle_t fxls8974Driver, FXLS8974 sensor I2C handle.
324  * @param[in/out] fxls8974_selftest_t *selftest, pointer to FXLS8974 selftest metadata.
325  * @return returns the status of the operation..
326  */
328 void FRM_Recorder_Init();
329 
330 /*******************************************************************************
331  * Code
332  ******************************************************************************/
333 void fxls8974_isr_callback(void *pUserData)
334 { /*! @brief Set flag to indicate Sensor has signalled data ready. */
335  bFxls8974IntFlag = true;
336 }
337 
338 /* Create TSA table and add output variables. */
339 /*!
340  * @brief Target Side Addressable (TSA) table created for this application.
341  */
343  FMSTR_TSA_STRUCT(fxls8974_acceldata_t)
344 
345  FMSTR_TSA_STRUCT(fxls8974_allregs_t)
346  FMSTR_TSA_MEMBER(fxls8974_allregs_t, offset, FMSTR_TSA_UINT8)
347  FMSTR_TSA_MEMBER(fxls8974_allregs_t, value, FMSTR_TSA_UINT8)
348  FMSTR_TSA_MEMBER(fxls8974_allregs_t, trigger, FMSTR_TSA_UINT8)
349  FMSTR_TSA_MEMBER(fxls8974_allregs_t, read_offset, FMSTR_TSA_UINT8)
350  FMSTR_TSA_MEMBER(fxls8974_allregs_t, read_value, FMSTR_TSA_UINT8)
351  FMSTR_TSA_MEMBER(fxls8974_allregs_t, read_trigger, FMSTR_TSA_UINT8)
352  FMSTR_TSA_MEMBER(fxls8974_allregs_t, readall_value, FMSTR_TSA_UINT8)
353  FMSTR_TSA_MEMBER(fxls8974_allregs_t, readall_size, FMSTR_TSA_UINT8)
354  FMSTR_TSA_MEMBER(fxls8974_allregs_t, readall_trigger, FMSTR_TSA_UINT8)
355  FMSTR_TSA_MEMBER(fxls8974_allregs_t, trigger_accel_offnoise, FMSTR_TSA_UINT8)
356  FMSTR_TSA_MEMBER(fxls8974_allregs_t, trigger_selftest, FMSTR_TSA_UINT8)
357  FMSTR_TSA_MEMBER(fxls8974_allregs_t, fs_value, FMSTR_TSA_UINT8)
358  FMSTR_TSA_MEMBER(fxls8974_allregs_t, mods_value, FMSTR_TSA_UINT8)
359  FMSTR_TSA_MEMBER(fxls8974_allregs_t, odr_value, FMSTR_TSA_UINT8)
360  FMSTR_TSA_MEMBER(fxls8974_allregs_t, toggle, FMSTR_TSA_UINT8)
361  FMSTR_TSA_MEMBER(fxls8974_allregs_t, reg_addr, FMSTR_TSA_UINT8)
362  FMSTR_TSA_MEMBER(fxls8974_allregs_t, accel, FMSTR_TSA_FLOAT)
363  FMSTR_TSA_MEMBER(fxls8974_allregs_t, accelraw, FMSTR_TSA_SINT16)
364  FMSTR_TSA_MEMBER(fxls8974_allregs_t, sdcd, FMSTR_TSA_UINT8)
365  FMSTR_TSA_MEMBER(fxls8974_allregs_t, temp, FMSTR_TSA_SINT8)
366  FMSTR_TSA_MEMBER(fxls8974_allregs_t, selftest, FMSTR_TSA_SINT16)
367  FMSTR_TSA_MEMBER(fxls8974_allregs_t, dataready_cntr, FMSTR_TSA_UINT8)
368  FMSTR_TSA_MEMBER(fxls8974_allregs_t, timestamp, FMSTR_TSA_UINT32)
369 
370  FMSTR_TSA_STRUCT(fxls8974_offset_noise_t)
371  FMSTR_TSA_MEMBER(fxls8974_offset_noise_t, offx, FMSTR_TSA_FLOAT)
372  FMSTR_TSA_MEMBER(fxls8974_offset_noise_t, offy, FMSTR_TSA_FLOAT)
373  FMSTR_TSA_MEMBER(fxls8974_offset_noise_t, offz, FMSTR_TSA_FLOAT)
374  FMSTR_TSA_MEMBER(fxls8974_offset_noise_t, rmsx, FMSTR_TSA_FLOAT)
375  FMSTR_TSA_MEMBER(fxls8974_offset_noise_t, rmsy, FMSTR_TSA_FLOAT)
376  FMSTR_TSA_MEMBER(fxls8974_offset_noise_t, rmsz, FMSTR_TSA_FLOAT)
377  FMSTR_TSA_MEMBER(fxls8974_offset_noise_t, complete_accel_offnoise, FMSTR_TSA_UINT8)
378 
379 
380  FMSTR_TSA_STRUCT(fxls8974_selftest_t)
381  FMSTR_TSA_MEMBER(fxls8974_selftest_t, x_stoc, FMSTR_TSA_SINT16)
382  FMSTR_TSA_MEMBER(fxls8974_selftest_t, y_stoc, FMSTR_TSA_SINT16)
383  FMSTR_TSA_MEMBER(fxls8974_selftest_t, z_stoc, FMSTR_TSA_SINT16)
384  FMSTR_TSA_MEMBER(fxls8974_selftest_t, x_stof, FMSTR_TSA_SINT16)
385  FMSTR_TSA_MEMBER(fxls8974_selftest_t, y_stof, FMSTR_TSA_SINT16)
386  FMSTR_TSA_MEMBER(fxls8974_selftest_t, z_stof, FMSTR_TSA_SINT16)
387  FMSTR_TSA_MEMBER(fxls8974_selftest_t, complete_selftest, FMSTR_TSA_UINT8)
388 
389  FMSTR_TSA_RO_VAR(rawData, FMSTR_TSA_USERTYPE(fxls8974_acceldata_t))
390 
391  FMSTR_TSA_RW_VAR(registers, FMSTR_TSA_USERTYPE(fxls8974_allregs_t))
392 
393  FMSTR_TSA_RO_VAR(offnoise_data, FMSTR_TSA_USERTYPE(fxls8974_offset_noise_t))
394 
395  FMSTR_TSA_RO_VAR(selftest, FMSTR_TSA_USERTYPE(fxls8974_selftest_t))
396 
397 FMSTR_TSA_TABLE_END()
398 
399 FMSTR_TSA_TABLE_LIST_BEGIN()
400  FMSTR_TSA_TABLE(main_table)
401 FMSTR_TSA_TABLE_LIST_END()
402 
403 /*!
404  * @brief FreeMASTER recorder initialization
405  */
406 void FRM_Recorder_Init()
407 {
408  /* Do local configuration of additional recorder */
409 
410  /* Setup the additional recorder raw buffer */
411  recBuffCfg.addr = recBuffer;
412  recBuffCfg.size = sizeof(recBuffer);
413  recBuffCfg.basePeriod_ns = 0; /* Unknown period */
414  recBuffCfg.name = "FXLS8974 3-Axis Accelerometer Data";
415 
416  FMSTR_RecorderCreate(1, &recBuffCfg);
417 }
418 
419 /*!
420  * @brief Main function
421  */
422 
423 int main(void)
424 {
425  int32_t status;
426  uint8_t whoami = 0;
427  uint8_t regdata;
428  float sensitivity = ACCEL_4G_SENS;
429 
430  ARM_DRIVER_I2C *I2Cdrv = &I2C_S_DRIVER; // Now using the shield.h value!!!
433 
434  /*! Initialize the MCU hardware. */
435  BOARD_InitPins();
439 
440  /*! Initialize FXLS8974_INT1 pin used by FRDM board */
441  pGpioDriver->pin_init(&FXLS8974_INT1, GPIO_DIRECTION_IN, NULL, &fxls8974_isr_callback, NULL);
442 
443  /*! Initialize RGB LED pin used by FRDM board */
444  pGpioDriver->pin_init(&GREEN_LED, GPIO_DIRECTION_OUT, NULL, NULL, NULL);
445 
446  /*! FreeMASTER communication layer initialization */
447  init_freemaster_uart();
448 
449  /*! Initialize the I2C driver. */
450  status = I2Cdrv->Initialize(I2C_S_SIGNAL_EVENT);
451  if (ARM_DRIVER_OK != status)
452  {
453  return -1;
454  }
455 
456  /*! Set the I2C Power mode. */
457  status = I2Cdrv->PowerControl(ARM_POWER_FULL);
458  if (ARM_DRIVER_OK != status)
459  {
460  return -1;
461  }
462 
463  /*! Set the I2C bus speed. */
464  status = I2Cdrv->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_FAST);
465  if (ARM_DRIVER_OK != status)
466  {
467  return -1;
468  }
469 
470  /*! Initialize FXLS8974 sensor driver. */
472  &whoami);
473  if (SENSOR_ERROR_NONE != status)
474  {
475  return status;
476  }
477 
478  /*! Set the task to be executed while waiting for I2C transactions to complete. */
480 
481  /*! Configure the FXLS8974 sensor. */
482  status = FXLS8974_I2C_Configure(&fxls8974Driver, cFxls8974ConfigNormal);
483  if (SENSOR_ERROR_NONE != status)
484  {
485  return status;
486  }
487 
488  /*! FreeMASTER Driver Initialization */
489  FMSTR_Init();
490 
491  /*! FreeMASTER Recorder Initialization */
493 
494  /*! Open FreeMASTER Pipe and get a Pipe handle */
495  FMSTR_HPIPE hpipe = FMSTR_PipeOpen(3, NULL, (FMSTR_ADDR)pipe3_rxb, sizeof(pipe3_rxb), (FMSTR_ADDR)pipe3_txb, sizeof(pipe3_txb),
496  FMSTR_PIPE_TYPE_ANSI_TERMINAL, "streaming");
497 
498  /*! Initialize trigger flags */
499  registers.toggle = 1;
500  registers.trigger = 0;
501  registers.read_trigger = 0;
502  registers.read_value = 0;
503  registers.readall_trigger = 0;
504  registers.trigger_accel_offnoise=0;
505  registers.trigger_selftest=0;
506  registers.dataready_cntr = 0;
507  registers.selftest[0]=0;
508  registers.selftest[1]=0;
509  registers.selftest[2]=0;
510  registers.timestamp = 0;
511 
512  for(int i = 0; i < FXLS8974_NUM_REGISTERS; i++)
513  {
514  registers.readall_value[i] = 0;
515  }
516 
517  for (;;) /* Forever loop */
518  {
519 
520  /*! Calling Recorder#0 in execution loop for generic high-speed variables sampling. */
521  FMSTR_Recorder(0);
522 
523  /*! FreeMASTER host communication polling mode */
524  FMSTR_Poll();
525 
526  /*! Check for any write register trigger from Host */
527  if (registers.trigger == 1)
528  {
529  /*! Apply Register Write */
530  status = apply_register_write(fxls8974Driver, registers.offset, registers.value);
531  if (SENSOR_ERROR_NONE != status)
532  {
533  return status;
534  }
535  registers.trigger = 0;
536  /*! Update drop down menu selection based on updated register write */
538  }
539 
540  /*! Check for any read register trigger from Host */
541  if (registers.read_trigger == 1)
542  {
543  /*! Apply Register Write */
544  status = apply_register_read(fxls8974Driver, registers.read_offset, &(registers.read_value));
545  if (SENSOR_ERROR_NONE != status)
546  {
547  return status;
548  }
549  registers.read_trigger = 0;
550  /*! Update drop down menu selection based on updated register read */
552  }
553 
554  /*! Check for any read all register trigger from Host */
555  if (registers.readall_trigger == 1)
556  {
557  /*! Apply Register Write */
558  status = apply_register_readall(fxls8974Driver);
559  if (SENSOR_ERROR_NONE != status)
560  {
561  return status;
562  }
563  registers.readall_trigger = 0;
565  /*! Update drop down menu selection based on updated all register read */
567  }
568 
569  /*! Wait for data ready interrupt from the FXLS8974. */
570  if (false == bFxls8974IntFlag)
571  { /* Loop, if new sample is not available. */
573  continue;
574  }
575  else
576  { /*! Clear the data ready flag, it will be set again by the ISR. */
577  bFxls8974IntFlag = false;
578  pGpioDriver->toggle_pin(&GREEN_LED);
579  }
580 
581  /*! Calling Recorder#1 for sampling sensor data when we get sensor data ready interrupt based on ODR. */
582  FMSTR_Recorder(1);
583 
584  /*! Read new raw sensor data from the FXLS8974. */
585  status = FXLS8974_I2C_ReadData(&fxls8974Driver, FXLS8974_ALL_REG_READ, registers.reg_addr);
586  if (ARM_DRIVER_OK != status)
587  {
588  return -1;
589  }
590 
591  /* Update timestamp from Systick framework. */
593 
594  /*! Increment data ready counter and check for rollover */
595  registers.dataready_cntr++;
596  if(MAX8BITSTORAGE == registers.dataready_cntr)
597  {
598  registers.dataready_cntr = 0;
599  }
600 
601  registers.temp = registers.reg_addr[1]+25;
602  registers.sdcd = (registers.reg_addr[0] & 0x10)>>4;
603 
604  /*! Convert the raw sensor data to signed 16-bit container for display to the debug port. */
605  rawData.accel[0] = (int16_t)(((int16_t)(((int16_t)registers.reg_addr[3] << 8) | registers.reg_addr[2])));
606  rawData.accel[1] = (int16_t)(((int16_t)(((int16_t)registers.reg_addr[5] << 8) | registers.reg_addr[4])));
607  rawData.accel[2] = (int16_t)(((int16_t)(((int16_t)registers.reg_addr[7] << 8) | registers.reg_addr[6])));
608 
609  registers.accelraw[0] = rawData.accel[0];
610  registers.accelraw[1] = rawData.accel[1];
611  registers.accelraw[2] = rawData.accel[2];
612 
613  /*! Add data log into Pipe TX */
614  FMSTR_PipePrintf(hpipe, "%d\t%d\t%d\t%d\t%d\n", registers.timestamp, registers.dataready_cntr, registers.accelraw[0], registers.accelraw[1], registers.accelraw[2]);
615 
616  status = FXLS8974_I2C_ReadData(&fxls8974Driver, cFXLS8974_whoami, (uint8_t *)&registers.reg_addr[13]);
617 
618  /*! Check the FS and apply sensitivity */
619  status = FXLS8974_I2C_ReadData(&fxls8974Driver, cFXLS8974_fs_src, &regdata);
620  if ((regdata & FXLS8974_SENS_CONFIG1_FSR_MASK) == 2)
621  {
622  sensitivity = ACCEL_4G_SENS;
623  }
624  else if ((regdata & FXLS8974_SENS_CONFIG1_FSR_MASK) == 4)
625  {
626  sensitivity = ACCEL_8G_SENS;
627  }
628  else if ((regdata & FXLS8974_SENS_CONFIG1_FSR_MASK) == 6)
629  {
630  sensitivity = ACCEL_16G_SENS;
631  }
632  else
633  {
634  sensitivity = ACCEL_2G_SENS;
635  }
636 
637  /*! Convert raw values to Gs */
638  registers.accel[0] = (float) (rawData.accel[0] * sensitivity);
639  registers.accel[1] = (float) (rawData.accel[1] * sensitivity);
640  registers.accel[2] = (float) (rawData.accel[2] * sensitivity);
641 
642  if (prev_toggle != registers.toggle)
643  {
644  pGpioDriver->toggle_pin(&GREEN_LED);
645  prev_toggle = registers.toggle;
646  }
647 
648  /*! Call offset and noise calculation function for FXLS8974 */
649  if (registers.trigger_accel_offnoise == 1)
650  {
651  accel_off_noise(&(rawData), &(offnoise_data), sensitivity);
652  if (offnoise_data.complete_accel_offnoise == 1)
653  {
654  registers.trigger_accel_offnoise = 0;
655  }
656  }
657 
658  /*! Call self-test function */
659  if (registers.trigger_selftest == 1)
660  {
661  perform_selftest(fxls8974Driver, &selftest);
662  if (selftest.complete_selftest == 1)
663  {
664  registers.trigger_selftest = 0;
665 
666  /*! Re-Configure the FXLS8974 sensor to default configuration */
667  status = FXLS8974_I2C_Configure(&fxls8974Driver, cFxls8974ConfigNormal);
668  if (SENSOR_ERROR_NONE != status)
669  {
670  return status;
671  }
672  }
673  }
674 
675  }
676 }
677 
678 
679 /*!
680  * @brief Service register write trigger from Host
681  */
682 int32_t apply_register_write(fxls8974_i2c_sensorhandle_t fxls8974Driver, uint8_t offset, uint8_t value)
683 {
684  int32_t status;
685 
686  if (offset > FXLS8974_NUM_REGISTERS)
687  {
689  }
690 
691  registerwritelist_t fxls8974_register_write[] = {
692  /*! Set register offset with provided value */
693  {offset, value, 0},
695 
696  status = FXLS8974_I2C_Configure(&fxls8974Driver, fxls8974_register_write);
697  if (SENSOR_ERROR_NONE != status)
698  {
699  return SENSOR_ERROR_WRITE;
700  }
701 
702  return SENSOR_ERROR_NONE;
703 }
704 
705 /*!
706  * @brief Service register read trigger from Host
707  */
708 int32_t apply_register_read(fxls8974_i2c_sensorhandle_t fxls8974Driver, uint8_t read_offset, uint8_t *read_value)
709 {
710  int32_t status;
711 
712  if (read_offset > FXLS8974_NUM_REGISTERS)
713  {
715  }
716 
717  registerreadlist_t fxls8974_register_read[] = {
718  /*! Set register offset with provided value */
719  {.readFrom = read_offset, .numBytes = 1}, __END_READ_DATA__};
720 
721  status = FXLS8974_I2C_ReadData(&fxls8974Driver, fxls8974_register_read, read_value);
722  if (SENSOR_ERROR_NONE != status)
723  {
724  return SENSOR_ERROR_WRITE;
725  }
726 
727  return SENSOR_ERROR_NONE;
728 }
729 
730 /*!
731  * @brief Service register read all trigger from Host
732  */
734 {
735  int32_t status;
736 
737  for (int reg_offset = FXLS8974_INT_STATUS; reg_offset <= FXLS8974_SELF_TEST_CONFIG2; reg_offset++)
738  {
739  registerreadlist_t fxls8974_register_readall[] = {
740  /*! Set register offset with provided value */
741  {.readFrom = reg_offset, .numBytes = 1}, __END_READ_DATA__};
742 
743  status = FXLS8974_I2C_ReadData(&fxls8974Driver, fxls8974_register_readall, &(registers.readall_value[reg_offset]));
744  if (SENSOR_ERROR_NONE != status)
745  {
746  return SENSOR_ERROR_READ;
747  }
748  }
749 
750  return SENSOR_ERROR_NONE;
751 }
752 
753 /*!
754  * @brief Update drop down selection values based on register write, read or readall.
755  */
757 {
758 
760 
761  switch (caller)
762  {
763  case FXLS8974_REG_WRITE:
764 
765  /*! Update drop down option based on updated read value */
766  if(FXLS8974_SENS_CONFIG1 == registers->offset) //FS Selection
767  {
768  registers->fs_value = registers->value;
769  }
770  else if (FXLS8974_SENS_CONFIG2 == registers->offset)
771  {
772  registers->mods_value = registers->value;
773  }
774  else if (FXLS8974_SENS_CONFIG3 == registers->offset)
775  {
776  registers->odr_value = registers->value;
777  }
778  break;
779  case FXLS8974_REG_READ: //Called from Register Read
780 
781  /*! Update drop down option based on updated read value */
782  if(FXLS8974_SENS_CONFIG1 == registers->read_offset) //FS Selection
783  {
784  registers->fs_value = registers->read_value;
785  }
786  else if (FXLS8974_SENS_CONFIG2 == registers->read_offset)
787  {
788  registers->mods_value = registers->read_value;
789  }
790  else if (FXLS8974_SENS_CONFIG3 == registers->read_offset)
791  {
792  registers->odr_value = registers->read_value;
793  }
794  break;
795  case FXLS8974_ALLREG_READ: //Called from Register ReadAll
796 
797  /*! Update drop down option based on updated read values */
798  registers->fs_value = registers->reg_addr[FXLS8974_SENS_CONFIG1];
799  registers->mods_value = registers->reg_addr[FXLS8974_SENS_CONFIG2];
800  registers->odr_value = registers->reg_addr[FXLS8974_SENS_CONFIG3];
801  break;
802  default:
804  break;
805  }
806 
807  return status;
808 
809 }
810 
811 /*******************************************************************************
812  * OFFSET NOISE CALCULATION
813  ******************************************************************************/
814 
815 /*!
816  * @brief Initialize Offset-Noise Variables
817  */
819 {
820  offnoiseptr->offx = 0.0;
821  offnoiseptr->offy = 0.0;
822  offnoiseptr->offz = 0.0;
823  offnoiseptr->rmsx = 0.0;
824  offnoiseptr->rmsy = 0.0;
825  offnoiseptr->rmsz = 0.0;
826  offnoiseptr->complete_accel_offnoise = 0;
827 }
828 
829 
830 /* Calculate Offset & Noise for FXLS8974 */
831 void accel_off_noise(fxls8974_acceldata_t* rawData, fxls8974_offset_noise_t *offnoiseptr, float sens)
832 {
833  uint16_t j;
834  static uint16_t k=0;
835  static uint16_t cntr=0;
836  static float stdx=0;
837  static float stdy=0;
838  static float stdz=0;
839  static float xx[N], yy[N], zz[N];
840  static float xm[N], ym[N], zm[N];
841  static float xsq[N], ysq[N], zsq[N];
842  float am[3];
843  static float sumx=0.0;
844  static float sumy=0.0;
845  static float sumz=0.0;
846 
847  /* Init offset noise variables */
848  offset_noise_init(offnoiseptr);
849 
850  cntr++;
851 
852  /* Store Accel samples and calculate sum for configured N */
853  if(cntr < N)
854  {
855  am[0]=rawData->accel[0]*sens;
856  am[1]=rawData->accel[1]*sens;
857  am[2]=rawData->accel[2]*sens;
858  xx[k]=am[0];
859  yy[k]=am[1];
860  zz[k]=am[2];
861  sumx+=am[0];
862  sumy+=am[1];
863  sumz+=am[2];
864  k+=1;
865  offnoiseptr->complete_accel_offnoise = 0;
866  }
867 
868  /* Measure offset and RMS */
869  if(cntr == N)
870  {
871  /* Measure average */
872  sumx=sumx/(N-1);
873  sumy=sumy/(N-1);
874  sumz=sumz/(N-1);
875 
876  /* Measure offset */
877  offnoiseptr->offx=0-sumx;
878  offnoiseptr->offy=0-sumy;
879  offnoiseptr->offz=1-sumz;
880 
881  /* Measure standard deviation */
882  for(j=0; j<N-1; j++)
883  {
884  xm[j]=xx[j]-sumx;
885  ym[j]=yy[j]-sumy;
886  zm[j]=zz[j]-sumz;
887 
888  xsq[j]=(float)pow(xm[j],2);
889  ysq[j]=(float)pow(ym[j],2);
890  zsq[j]=(float)pow(zm[j],2);
891  stdx+=xsq[j];
892  stdy+=ysq[j];
893  stdz+=zsq[j];
894  }
895  stdx=stdx/(N-2);
896  stdy=stdy/(N-2);
897  stdz=stdz/(N-2);
898 
899  /* Measure RMS */
900  offnoiseptr->rmsx=(float)pow(stdx,0.5);
901  offnoiseptr->rmsy=(float)pow(stdy,0.5);
902  offnoiseptr->rmsz=(float)pow(stdz,0.5);
903 
904  /* Set the completion flag */
905  offnoiseptr->complete_accel_offnoise = 1;
906 
907  /* Reset local storage */
908  cntr = k = 0;
909  sumx = sumy = sumz = 0;
910  stdx = stdy = stdz = 0;
911  }
912 }
913 
914 /*!
915  * @brief Initialize Offset-Noise Variables
916  */
918 {
919  selftest->x_stoc = 0;
920  selftest->y_stoc = 0;
921  selftest->z_stoc = 0;
922  selftest->x_stof = 0;
923  selftest->y_stof = 0;
924  selftest->z_stof = 0;
925  selftest->complete_selftest = 0;
926 }
927 
928 
930 {
931  int32_t status;
932 
933  axis=0;
934 
935  /* Initialize self-test parameters */
936  selftest_init(selftest);
937 
938  while (axis<6)
939  {
940 
941  switch(axis)
942  {
943  case 0:status = FXLS8974_I2C_Configure(&fxls8974Driver, cFxls8974STXP);break;
944  case 1:status = FXLS8974_I2C_Configure(&fxls8974Driver, cFxls8974STXN);break;
945  case 2:status = FXLS8974_I2C_Configure(&fxls8974Driver, cFxls8974STYP);break;
946  case 3:status = FXLS8974_I2C_Configure(&fxls8974Driver, cFxls8974STYN);break;
947  case 4:status = FXLS8974_I2C_Configure(&fxls8974Driver, cFxls8974STZP);break;
948  case 5:status = FXLS8974_I2C_Configure(&fxls8974Driver, cFxls8974STZN);break;
949  default:break;
950  }
951 
952  if (ARM_DRIVER_OK != status)
953  {
954  return status;
955  }
956 
957  int counter =0;
958  for(counter=0;counter<1;counter++)
959  {
960 
961  // In ISR Mode we do not need to check Data Ready Register.
962  // The receipt of interrupt will indicate data is ready.
963  RAW_DATA data_ = {0x00};
964  while(false == bFxls8974IntFlag)
965  {
966 
967  }
968 
969  /*! Set device to Standby mode. */
971  if (ARM_DRIVER_OK != status)
972  {
973  return SENSOR_ERROR_WRITE;
974  }
975 
976 
977  bFxls8974IntFlag = false;
978  //pGpioDriver->toggle_pin(&RED_LED);
979 
980  /*! Read new raw sensor data from the FXLS8974. */
981  status = FXLS8974_I2C_ReadData(&fxls8974Driver, cFxls8974OutputNormal, &data_.byte_data[0]);
982  if (ARM_DRIVER_OK != status)
983  { /* Read did not work, so loop. */
984  continue;
985  }
986 
987  /* store the self-test values for each axis & for each polarity*/
988  switch(axis)
989  {
990  case 0: XSTP[counter]= data_.dat.xdata;break;
991  case 1: XSTN[counter]= data_.dat.xdata;break;
992  case 2: YSTP[counter]= data_.dat.ydata;break;
993  case 3: YSTN[counter]= data_.dat.ydata;break;
994  case 4: ZSTP[counter]= data_.dat.zdata;break;
995  case 5: ZSTN[counter]= data_.dat.zdata;break;
996  default:break;
997  }
998 
999  }
1000 
1001  BOARD_DELAY_ms(1000);
1002  axis++;
1003  }
1004 
1005  /* compute self-test output change*/
1006  selftest->x_stoc=(XSTP[0]-XSTN[0])/2;
1007  selftest->y_stoc=(YSTP[0]-YSTN[0])/2;
1008  selftest->z_stoc=(ZSTP[0]-ZSTN[0])/2;
1009 
1010  /* compute self-test offset*/
1011  selftest->x_stof=(XSTP[0]+XSTN[0])/2;
1012  selftest->y_stof=(YSTP[0]+YSTN[0])/2;
1013  selftest->z_stof=(ZSTP[0]+ZSTN[0])/2;
1014 
1015  selftest->complete_selftest = 1;
1016  return SENSOR_ERROR_NONE;
1017 }
1018 
1019 /*!
1020  * @brief UART Module initialization (UART is a the standard block included e.g. in K22F)
1021  */
1022 static void init_freemaster_uart(void)
1023 {
1024  uart_config_t config;
1025 
1026  /*
1027  * config.baudRate_Bps = 115200U;
1028  * config.parityMode = kUART_ParityDisabled;
1029  * config.stopBitCount = kUART_OneStopBit;
1030  * config.txFifoWatermark = 0;
1031  * config.rxFifoWatermark = 1;
1032  * config.enableTx = false;
1033  * config.enableRx = false;
1034  */
1035  UART_GetDefaultConfig(&config);
1036  config.baudRate_Bps = 115200U;
1037  config.enableTx = false;
1038  config.enableRx = false;
1039 
1040  UART_Init((UART_Type*)BOARD_DEBUG_UART_BASEADDR, &config, BOARD_DEBUG_UART_CLK_FREQ);
1041 
1042  /* Register communication module used by FreeMASTER driver. */
1043  FMSTR_SerialSetBaseAddress((UART_Type*)BOARD_DEBUG_UART_BASEADDR);
1044 
1045 #if FMSTR_SHORT_INTR || FMSTR_LONG_INTR
1046  /* Enable UART interrupts. */
1047  EnableIRQ(BOARD_UART_IRQ);
1048  EnableGlobalIRQ(0);
1049 #endif
1050 }
1051 
1052 #if FMSTR_SHORT_INTR || FMSTR_LONG_INTR
1053 /*
1054 * Application interrupt handler of communication peripheral used in interrupt modes
1055 * of FreeMASTER communication.
1056 *
1057 * NXP MCUXpresso SDK framework defines interrupt vector table as a part of "startup_XXXXXX.x"
1058 * assembler/C file. The table points to weakly defined symbols, which may be overwritten by the
1059 * application specific implementation. FreeMASTER overrides the original weak definition and
1060 * redirects the call to its own handler.
1061 *
1062 */
1063 
1064 void BOARD_UART_IRQ_HANDLER(void)
1065 {
1066  /* Call FreeMASTER Interrupt routine handler */
1067  FMSTR_SerialIsr();
1068  /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
1069  exception return operation might vector to incorrect interrupt */
1070 #if defined __CORTEX_M && (__CORTEX_M == 4U)
1071  __DSB();
1072 #endif
1073 }
1074 #endif
1075 
FMSTR_REC_BUFF recBuffCfg
int32_t status
#define FXLS8974_SENS_CONFIG1_ST_POL_MASK
Definition: fxls8974.h:429
int32_t gSystick
#define FXLS8974_INT_EN_DRDY_EN_MASK
Definition: fxls8974.h:850
const registerreadlist_t cFXLS8974_int_src[]
Prepare the register read for INT Status Register.
FMSTR_REC_CFG recCfg
#define FXLS8974_INT1
int32_t apply_register_read(fxls8974_i2c_sensorhandle_t fxls8974Driver, uint8_t offset, uint8_t *value)
Function to apply FXLS8974 register read operation.
const registerwritelist_t cFxls8974ConfigNormal[]
Defines the register write list to configure FXLS8974 in Interrupt mode.
This structure defines the Write command List.
Definition: sensor_drv.h:68
#define FXLS8974_SENS_CONFIG1_FSR_MASK
Definition: fxls8974.h:423
int32_t FXLS8974_I2C_Configure(fxls8974_i2c_sensorhandle_t *pSensorHandle, const registerwritelist_t *pRegWriteList)
The interface function to configure he sensor.
Definition: fxls8974_drv.c:285
#define FXLS8974_DATA_SIZE
#define I2C_S_SIGNAL_EVENT
Definition: issdk_hal.h:34
int32_t FXLS8974_I2C_Initialize(fxls8974_i2c_sensorhandle_t *pSensorHandle, ARM_DRIVER_I2C *pBus, uint8_t index, uint16_t sAddress, uint8_t *whoami)
The interface function to initialize the sensor.
Definition: fxls8974_drv.c:239
#define FXLS8974_SENS_CONFIG1_ST_AXIS_SEL_DISABLED
Definition: fxls8974.h:442
status_t SMC_SetPowerModeVlpr(void *arg)
Configures the system to VLPR power mode. API name used from Kinetis family to maintain compatibility...
Definition: lpc54114.c:169
#define FXLS8974_SENS_CONFIG1_ST_AXIS_SEL_EN_X
Definition: fxls8974.h:444
const registerwritelist_t cFxls8974STYN[]
Register settings for Self-Test in Y Axis (Negative polarity).
int32_t Register_I2C_Write(ARM_DRIVER_I2C *pCommDrv, registerDeviceInfo_t *devInfo, uint16_t slaveAddress, uint8_t offset, uint8_t value, uint8_t mask, bool repeatedStart)
The interface function to write a sensor register.
void BOARD_DELAY_ms(uint32_t delay_ms)
Function to insert delays.
Definition: systick_utils.c:81
void FRM_Recorder_Init()
volatile bool bFxls8974IntFlag
uint8_t prev_toggle
#define FXLS8974_INT_EN_DRDY_EN_EN
Definition: fxls8974.h:857
#define FXLS8974_SENS_CONFIG2_ANIC_TEMP_EN
Definition: fxls8974.h:521
enum fxls8974_operation_type fxls8974_operation_type_t
This structure defines the fxls8974 host operation type.
const registerreadlist_t FXLS8974_ALL_REG_READ[]
FXLS8974 register list to read all registers.
const registerreadlist_t cFXLS8974_whoami[]
#define BOARD_BootClockRUN
Definition: clock_config.h:19
fxls8974_offset_noise_t offnoise_data
#define ACCEL_2G_SENS
Access structure of the GPIO Driver.
Definition: Driver_GPIO.h:38
This defines the sensor specific information for I2C.
Definition: fxls8974_drv.h:43
#define SMC
Definition: lpc54114.h:118
int16_t YSTN[2]
void selftest_init(fxls8974_selftest_t *selftest)
Function to initialize FXLS8974 self test metadata.
This structure defines the fxls8974 all registers metadata.
#define FXLS8974_SENS_CONFIG1_FSR_16G
Definition: fxls8974.h:459
#define __END_WRITE_DATA__
Definition: sensor_drv.h:45
#define FXLS8974_SENS_CONFIG1_ST_POL_POSITIVE
Definition: fxls8974.h:447
int16_t YSTP[2]
#define BOARD_DEBUG_UART_CLK_FREQ
Definition: board.h:26
typedef int32_t(DATA_FORMAT_Append_t))(void *pData
The interface function to append the data on the formated stream.
#define FXLS8974_NUM_REGISTERS
void BOARD_InitDebugConsole(void)
Definition: board.c:15
#define MAX8BITSTORAGE
#define ACCEL_16G_SENS
void offset_noise_init(fxls8974_offset_noise_t *offnoiseptr)
Function to initialize offset noise measurement.
This structure defines variables to compute self-test output change (STOC) and self-test offset (STOF...
uint8_t reg_addr[FXLS8974_NUM_REGISTERS]
const registerwritelist_t cFxls8974STXN[]
Register settings for Self-Test in X Axis (Negative polarity).
void(* registeridlefunction_t)(void *userParam)
This is the register idle function type.
Definition: sensor_drv.h:97
int32_t apply_register_readall(fxls8974_i2c_sensorhandle_t fxls8974Driver)
Function to apply FXLS8974 register read-all operation.
int32_t FXLS8974_I2C_ReadData(fxls8974_i2c_sensorhandle_t *pSensorHandle, const registerreadlist_t *pReadList, uint8_t *pBuffer)
The interface function to read the sensor data.
Definition: fxls8974_drv.c:330
void fxls8974_isr_callback(void *pUserData)
ISR for FXLS8974 interrupt source event.
#define FXLS8974_SENS_CONFIG1_ST_AXIS_SEL_EN_Z
Definition: fxls8974.h:446
GENERIC_DRIVER_GPIO * pGpioDriver
#define FXLS8974_I2C_ADDR
int32_t update_dropdown_selection(fxls8974_allregs_t *registers, uint8_t caller)
Function to update dropdown selection.
uint32_t BOARD_SystickElapsedTime_us(int32_t *pStart)
Function to compute the Elapsed Time.
Definition: systick_utils.c:64
This structure defines the fxls8974 raw data buffer.
Definition: fxls8974_drv.h:52
int main(void)
Main function.
const registerreadlist_t cFXLS8974_fs_src[]
Prepare the register read for FullScale range Register.
This structure defines the fxls8974 offset and noise calculation parameters.
#define FXLS8974_SENS_CONFIG1_FSR_4G
Definition: fxls8974.h:455
#define FXLS8974_SENS_CONFIG3_WAKE_ODR_12_5HZ
Definition: fxls8974.h:565
const registerwritelist_t cFxls8974STYP[]
Register settings for Self-Test in Y Axis (Positive polarity).
#define __END_READ_DATA__
Definition: sensor_drv.h:51
fxls8974_operation_type
This structure defines the fxls8974 host operation type.
#define FXLS8974_SENS_CONFIG2_ANIC_TEMP_MASK
Definition: fxls8974.h:496
#define ACCEL_4G_SENS
#define FXLS8974_SENS_CONFIG3_WAKE_ODR_MASK
Definition: fxls8974.h:551
FMSTR_REC_VAR recVar
void accel_off_noise(fxls8974_acceldata_t *rawData, fxls8974_offset_noise_t *offnoiseptr, float sens)
Function to measure accelerometer offset noise.
fxls8974_allregs_t registers
fxls8974_i2c_sensorhandle_t fxls8974Driver
#define I2C_S_DRIVER
Definition: issdk_hal.h:33
#define BOARD_UART_IRQ
Definition: board.h:27
int32_t perform_selftest(fxls8974_i2c_sensorhandle_t fxls8974Driver, fxls8974_selftest_t *selftest)
Function to perform FXLS8974 self test.
ARM_DRIVER_I2C * I2Cdrv
void FXLS8974_I2C_SetIdleTask(fxls8974_i2c_sensorhandle_t *pSensorHandle, registeridlefunction_t idleTask, void *userParam)
: The interface function to set the I2C Idle Task.
Definition: fxls8974_drv.c:277
FMSTR_TSA_TABLE_BEGIN(main_table)
Target Side Addressable (TSA) table created for this application.
uint16_t readFrom
Definition: sensor_drv.h:80
const registerreadlist_t cFxls8974OutputNormal[]
Address of Raw Accel Data in Normal Mode.
#define FXLS8974_SENS_CONFIG1_ST_AXIS_SEL_EN_Y
Definition: fxls8974.h:445
int16_t XSTN[2]
#define BOARD_DEBUG_UART_BASEADDR
Definition: board.h:24
void(* toggle_pin)(pinID_t aPinId)
Definition: Driver_GPIO.h:48
int32_t apply_register_write(fxls8974_i2c_sensorhandle_t fxls8974Driver, uint8_t offset, uint8_t value)
Function to apply FXLS8974 register write operation.
union rawdata RAW_DATA
int16_t ZSTN[2]
void BOARD_SystickEnable(void)
Function to enable systicks framework.
Definition: systick_utils.c:35
uint8_t axis
status_t SMC_SetPowerModeWait(void *arg)
Configures the system to WAIT power mode. API name used from Kinetis family to maintain compatibility...
Definition: lpc54114.c:155
void(* pin_init)(pinID_t aPinId, gpio_direction_t dir, void *apPinConfig, gpio_isr_handler_t aIsrHandler, void *apUserData)
Definition: Driver_GPIO.h:41
GENERIC_DRIVER_GPIO Driver_GPIO_KSDK
Definition: gpio_driver.c:177
This structure defines the Read command List.
Definition: sensor_drv.h:78
ARM Systick Utilities.
const registerwritelist_t cFxls8974STZP[]
Register settings for Self-Test in Z Axis (Positive polarity).
const registerwritelist_t cFxls8974STXP[]
Register settings for Self-Test in X Axis (Positive polarity).
#define FXLS8974_SENS_CONFIG1_ST_AXIS_SEL_MASK
Definition: fxls8974.h:432
gpioHandleKSDK_t GREEN_LED
Definition: frdm_k64f.c:188
The fxls8974_drv.h file describes the FXLS8974CF driver interface and structures. ...
uint8_t readall_value[FXLS8974_NUM_REGISTERS]
#define I2C_S_DEVICE_INDEX
Definition: issdk_hal.h:35
void BOARD_InitPins(void)
Configures pin routing and optionally pin electrical features.
Definition: pin_mux.c:47
const registerwritelist_t cFxls8974STZN[]
Register settings for Self-Test in Z Axis (Negative polarity).
int16_t ZSTP[2]
registerDeviceInfo_t deviceInfo
Definition: fxls8974_drv.h:45
#define BOARD_UART_IRQ_HANDLER
Definition: board.h:28
int16_t XSTP[2]
#define ACCEL_8G_SENS
This structure defines the fxls8962 raw data buffer.
fxls8974_selftest_t selftest
fxls8974_acceldata_t rawData
uint8_t byte_data[sizeof(sensor_data)]
#define FXLS8974_SENS_CONFIG1_ST_POL_NEGATIVE
Definition: fxls8974.h:449